/********************************************************************************************************************************
 * 《C ++ Primer》第五版中文版，读书笔记：按照书中的的示例源码和每一个小章节的课后习题，自己动手写代码实现，作为联系和测试。
 * Date: 2024-04-01 09:20
 * Author: dimon.chen 
 * EMali: 1181302388@qq.com 
 * 
 * 章节: 第三章 字符串，向量和数组
 *       3.3.2 向 vector 对象中添加元素
 * 
 ********************************************************************************************************************************/

#include <iostream>
#include <string>
#include <vector>

using std::cout;
using std::cin;
using std::endl;
using std::string;
using std::vector;

int main(int argc, char *argv[])
{
    vector<int> v2;         //一个空的vector对象
    for(int i=0; i!=100; i++)
    {
        v2.push_back(i);    //使用push_back把值作为尾元素压到vector对象尾端（back)
                            //vector的成员函数push_back
    }

    //范围for循环
    for(int value : v2)
        cout << value << " ";
    
    cout << endl;


    string word;        //默认初始化一个空string对象
    vector<string> text;    //一个空vector对象，其中存放元素的类型是string
    while(cin >> word)
    {
        if(word == "bye")
            break;
        text.push_back(word);
    }

    for(string svalue : text)
    {
        cout << svalue << endl;
    }


    for(auto svalue : text)
    {
        svalue = "XX";
    }

    //auto类型说明符，让编译器推断循环控制变量的类型，这里循环控制变量的类型为 标准库类型string 
    for(auto svalue : text)
    {
        cout << svalue << endl;
    }


    //auto类型说明符，让编译器推断循环控制变量的类型，这里循环控制变量的类型为 标准库类型string & 
    //指向string的引用
    //svalue类型是 std::string &, 引用
    for(auto &svalue : text)
    {
        svalue = "XX";
    }

    //auto类型说明符，让编译器推断循环控制变量的类型，这里循环控制变量的类型为 标准库类型string 
    for(auto svalue : text)
    {
        cout << svalue << endl;
    }


    // 3.3.2 节练习
    // 练习3.14：编写一段程序，用 cin 读入一组整数并把他们存入一个vector对象
    //

    int i;
    vector<int> ivec;           //默认初始化，一个空vector对象
    while(cin >> i)
        ivec.push_back(i);      //成员函数push_back，把值当做一个尾元素，压到(Push)到vector对象的尾端（back)
    
    for(auto ivalue : ivec)     //范围for语句，auto类型说明符，让编译器根据初始值推断变量的类型
        cout << ivalue << endl;

    //Note: 注意，范围for语句不能包含可能改变被遍历对象大小的语句

}
